/*
 * Persona.h
 *
 *  Created on: May 6, 2012
 *      Author: tuchorc
 */

#ifndef PERSONA_H_
#define PERSONA_H_

#include "../lib/Logger.h"
#include "../lib/Constantes.h"
#include "../lib/TiposDatos.h"
#include "../lib/MemoriaCompartida.h"
#include "../lib/Semaforo.h"
#include "../lib/MonitorPisos.h"
#include "../lib/ManejadorSemPisos.h"
#include "../lib/MonitorAscensores.h"
#include "../lib/ManejadorSemAscensores.h"

class Persona {

private:
	int mi_peso;
	int mi_piso_origen;
	int mi_piso_destino;
	int cantidad_pisos;
	char mi_estado;
	MonitorPisos * m_pisos;
	ManejadorSemPisos * sem_pisos;
	MonitorAscensores * m_asc;
	ManejadorSemAscensores * sem_asc;
	Logger* logger;

	/*Funciones de loggeo*/
	void log(std::string message);
	void sync(std::string message);
	void debug(std::string message);

	/*Funciones de calculos de propiedades*/
	void calcularPeso();
	void calcularPisoDestino();
	void calcularPisoOrigen();

	/*Setters de propiedades*/
	void setPeso(int peso) {
		mi_peso = peso;
	}
	void setPisoOrigen(int piso) {
		mi_piso_origen = piso;
	}
	void setPisoDestino(int piso) {
		mi_piso_destino = piso;
	}
	void setEstado(char estado) {
		mi_estado = estado;
	}

	/*Chequeo*/
	int estabaBajando();

	/*Nacimiento*/
	bool apuntarme();

public:
	Persona(int cantidad_pisos, int cantidad_asc, int capacidad, int velocidad,
			bool modoDebug, bool modoLog, bool modoSyn, bool modoCout);

	void inicializar();

	int llamarAscensorYEsperar();

	/*Getters de propiedades*/
	int getPeso() {
		return mi_peso;
	}
	int getPisoDestino() {
		return mi_piso_destino;
	}
	int getPisoOrigen() {
		return mi_piso_origen;
	}
	char getEstado() {
		return mi_estado;
	}

	virtual ~Persona();
};

#endif /* PERSONA_H_ */
